package com.xiaobias.a12;

import org.springframework.cglib.proxy.Enhancer;
import org.springframework.cglib.proxy.MethodInterceptor;

public class CglibProxyDemo {

    // 父类 不能有 final 关键字
    // Cannot subclass final class com.xiaobias.a12.CglibProxyDemo$Target
    static /*final*/ class Target {
        // 方法有 final cglib 不能执行代理增强
        public /*final*/ void foo() {
            System.out.println("target foo");
        }
    }

    // cglib代理：代理是子类型， 目标是父类型
    // jdk代理：  代理是兄弟类型， 目标是兄弟类型
    public static void main(String[] args) {
//        Target target = new Target();
        Target proxy = (Target) Enhancer.create(Target.class, (MethodInterceptor) (p, method, args1, methodProxy) -> {
            System.out.println("before...");
            // 正常调用:  目标.方法(参数)
            // 代理调用： 方法.invoke(目标, 参数)
//            Object result = method.invoke(target, args);
            // methodProxy 可以避免使用反射调用方法, methodProxy.invoke 内部没用反射的， Spring 默认
//            Object result = methodProxy.invoke(target, args);
            //  methodProxy.invokeSuper 需要代理
            Object result = methodProxy.invokeSuper(p, args);
            System.out.println("after...");
            return result;
        });
        proxy.foo();
    }
}
